package com.charging.business.vo;

import com.charging.business.exception.CustomizeException;
import com.charging.business.vo.obj.ProvinceFee;
import lombok.Data;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

/**
 * @author JerryLu
 * @date 2024/11/8 15:58
 * @description 车辆特情在线计费相应接口
 */
@Data
@Component
public class OnlineSpececResponse {
    /**
     * 特情计费结果
     * 必填：是
     * 0-网络访问异常,默认值
     * 1-特情计费成功
     * 2-入口站有误-路径不可达
     * 3-路径信息不可拟合-请使用其他拟合方式
     * 4-拟合超时-请使用其他拟合方式
     * 5-非跨省通行
     * 99~90 - 自定义必要字段校验失败
     * 100 - 报文解析失败
     **/
    public Integer calculateResult = 0;

    /**
     * 总应收金额
     * 单位： 分。 各省应收总金额累计。
     * payFee=splitAmount + discountFee
     * 必填：是
     */
    public Integer payFee = 0;

    /**
     * 总实收金额
     * 单位： 分。各省实收总金额累计。
     * 参考值， 不可用于结算
     * 必填：是
     */
    public Integer fee = 0;

    /**
     * 总优惠金额
     * 单位： 分。各省优惠总金额累计。
     * discountFee=payFee-splitAmount
     * 必填：是
     */
    public Integer discountFee = 0;

    /**
     * 总拆分金额
     * 单位： 分。各省拆分总金额累计， 用于现场收费。
     * splitAmount=payFee-discountFe
     * 必填：是
     */
    public Integer splitAmount = 0;

    /**
     * 总里程
     * 必填：是
     */
    public Integer feeMileage = 0;

    /**
     * 分省信息
     * 必填：是
     */
    public List<ProvinceFee> provinceFees = new ArrayList<>();

    public void check(int type) throws CustomizeException {
        //检查及计费修正
        if (getCalculateResult() == null) {
            calculateResult = 99;
        }
        if (getCalculateResult() == 1) {
            if (this.getProvinceFees() == null) {
                provinceFees = new ArrayList<>();
                calculateResult = 93;
            }
            try {
                fee = 0;
                payFee = 0;
                discountFee = 0;
                splitAmount = 0;
                feeMileage = 0;
                for (ProvinceFee prov : provinceFees) {
                    prov.checkProvince(type);

                    fee += prov.getFee();
                    payFee += prov.getPayFee();
                    discountFee += (prov.getPayFee() - prov.getSplitAmount());
                    splitAmount += prov.getSplitAmount();
                    feeMileage += prov.getFeeMileage();
                }
            } catch (CustomizeException e) {
                calculateResult = 90;
                throw new CustomizeException(e.getCustomMessage());
            }
        } else {
            if (payFee == null) {
                payFee = 0;
            }
            if (fee == null) {
                fee = 0;
            }
            if (discountFee == null) {
                discountFee = 0;
            }
            if (splitAmount == null) {
                splitAmount = 0;
            }
            if (feeMileage == null) {
                feeMileage = 0;
            }
            if (provinceFees == null) {
                provinceFees = new ArrayList<>();
            }
        }
    }
}
